import java.util.Stack;

/**
 * @author zhaoren
 * @version 1.0
 * @description 单例类
 * @date 2020/7/27 17:58
 **/
public class Singleton {

    private static Singleton lazySingleton = null;
    private static final Singleton hungrySingleton = new Singleton();

    //私有化构造方法
    private Singleton(){}

    /**
     * 懒汉式
     * 由单例类来提供单例对象的创建入口，但是这里需要注意的问题就是如何来保证在多线程的环境下
     * 也可保证创建的对象是单例的
     * @return {@link Singleton}
     */
    public static Singleton getInstance1() {
        if (lazySingleton == null){
            //先进行第一层判断如果不为空就没必要就行加锁了，减低性能开销
            synchronized (Singleton.class){
                if (lazySingleton == null){
                    //即使进入了锁中，依然要加第二层判断因为有可能同时两个以上的线程通过了第一层的判断
                    lazySingleton = new Singleton();
                    return lazySingleton;
                }
            }
        }
        return lazySingleton;
    }

    /**
     * 饿汉式单例模式
     * @return
     */
    public static Singleton getInstance2(){
        return hungrySingleton;
    }

}
